﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.IO;
using BusinessLogicLayer;
using DevComponents.DotNetBar.Controls;
using Equin.ApplicationFramework;

namespace PresentationLayer
{
    public delegate void CapNhatDS(LoaiHanhDong hd, PhieuMuon pm);
    public delegate void CapNhatDSCT(LoaiHanhDong hd, ChiTietPhieuMuon ctpm);

    public delegate void CapNhatDG(LoaiHanhDong hd, DocGia dg);
    public delegate void CapNhatTL(LoaiHanhDong hd, TheLoai tl);
    public delegate void CapNhatNXB(LoaiHanhDong hd, NXB nxb);
    public delegate void CapNhatSach(LoaiHanhDong hd, Sach sach);

    public partial class MainForm : DevComponents.DotNetBar.RibbonForm
    {
        public MainForm()
        {
            InitializeComponent();
            dgvPhieuMuon.CellDoubleClick += dgvPhieuMuon_CellDoubleClick;
            dgvTraCuuSach.CellDoubleClick += dgvTraCuuSach_CellDoubleClick;
            dgvNguoiDung.KeyDown += dgvNguoiDung_KeyDown;
            dgvPhat.KeyDown += dgvPhat_KeyDown;
            dgvSach.KeyDown += dgvSach_KeyDown;
            dgvTheLoai.KeyDown += dgvTheLoai_KeyDown;
            dgvNXB.KeyDown += dgvNXB_KeyDown;
            dgvPhieuMuon.KeyDown += dgvPhieuMuon_KeyDown;
            dgvDocGia.KeyDown += dgvDocGia_KeyDown;
            this.Load += MainForm_Load;
        }

        
       
        private int maNguoiDung;
        DataGridViewX dgvPhieuMuon = new DataGridViewX();
        DataGridViewX dgvSach = new DataGridViewX();
        DataGridViewX dgvNguoiDung = new DataGridViewX();
        DataGridViewX dgvPhat = new DataGridViewX();
        DataGridViewX dgvDocGia = new DataGridViewX();
        DataGridViewX dgvTheLoai = new DataGridViewX();
        DataGridViewX dgvNXB = new DataGridViewX();
        DataGridViewX dgvTraCuuSach = new DataGridViewX();
        DataGridViewX dgvSachBC = new DataGridViewX();
        DataGridViewX dgvDGBC = new DataGridViewX();

        private void ribbonControlQLTV_SelectedRibbonTabChanged(object sender, EventArgs e)
        {
            string tenTab = ribbonControlQLTV.SelectedRibbonTabItem.Name;
            switch (tenTab)
            {
                case "QLMuonSachTab":
                    #region Cài đặt dgvPhieuMuon
                    // Cài đặt các thuộc tính cần thiết
                    dgvPhieuMuon.AllowUserToAddRows = false;
                    dgvPhieuMuon.AllowUserToDeleteRows = false;
                    dgvPhieuMuon.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvPhieuMuon.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvPhieuMuon.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvPhieuMuon.Dock = DockStyle.Fill;
                    dgvPhieuMuon.MultiSelect = false;
                    dgvPhieuMuon.ReadOnly = true;
                    dgvPhieuMuon.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvPhieuMuon.AutoGenerateColumns = false;
                    dgvPhieuMuon.ContextMenuStrip = cmsQLMuonSach;

                    // Tạo các cột cần thiết
                    DataGridViewTextBoxColumn colMaPM = new DataGridViewTextBoxColumn();
                    colMaPM.HeaderText = "Mã phiếu mượn";
                    colMaPM.DataPropertyName = "MaPhieuMuon";
                    colMaPM.Name = "MaPhieuMuon";
                    colMaPM.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colMaDocGia = new DataGridViewTextBoxColumn();
                    colMaDocGia.HeaderText = "Mã độc giả";
                    colMaDocGia.DataPropertyName = "MaDocGia";
                    colMaDocGia.Name = "MaDocGia";

                    DataGridViewTextBoxColumn colNgayMuon = new DataGridViewTextBoxColumn();
                    colNgayMuon.HeaderText = "Ngày mượn";
                    colNgayMuon.DataPropertyName = "NgayMuon";
                    colNgayMuon.Name = "NgayMuon";
                    colNgayMuon.DefaultCellStyle.Format = "dd/MM/yyyy";

                    if (dgvPhieuMuon.Columns.Count == 0)
                        dgvPhieuMuon.Columns.AddRange(new DataGridViewColumn[] { colMaPM, colMaDocGia, colNgayMuon });

                    // Lấy DS PhieuMuon
                    ActionResultAsList<PhieuMuon> rs = new MuonSachManager().LayToanBoPM();
                    if (rs.Success)
                        dgvPhieuMuon.DataSource = new BindingListView<PhieuMuon>(rs.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvPhieuMuon);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvPhieuMuon.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLPhatTab":
                    #region Cài đặt dgvPhat
                    // Cài đặt các thuộc tính cần thiết
                    dgvPhat.ContextMenuStrip = this.cmsQLPhat;
                    dgvPhat.AllowUserToAddRows = false;
                    dgvPhat.AllowUserToDeleteRows = false;
                    dgvPhat.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvPhat.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvPhat.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvPhat.Dock = DockStyle.Fill;
                    dgvPhat.MultiSelect = false;
                    dgvPhat.ReadOnly = true;
                    dgvPhat.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvPhat.AutoGenerateColumns = false;

                    // Tạo các cột cần thiết
                    DataGridViewTextBoxColumn colMaPhat = new DataGridViewTextBoxColumn();
                    colMaPhat.HeaderText = "Mã phạt";
                    colMaPhat.DataPropertyName = "MaPhat";
                    colMaPhat.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colMaDG = new DataGridViewTextBoxColumn();
                    colMaDG.HeaderText = "Mã độc giả";
                    colMaDG.DataPropertyName = "MaDG";

                    DataGridViewTextBoxColumn colMaSachP = new DataGridViewTextBoxColumn();
                    colMaSachP.HeaderText = "Mã sách";
                    colMaSachP.DataPropertyName = "MaSach";

                    DataGridViewTextBoxColumn colLoaiPhat = new DataGridViewTextBoxColumn();
                    colLoaiPhat.HeaderText = "Loại phạt";
                    colLoaiPhat.DataPropertyName = "LoaiPhat";

                    DataGridViewTextBoxColumn colHinhPhat = new DataGridViewTextBoxColumn();
                    colHinhPhat.HeaderText = "Hình phạt";
                    colHinhPhat.DataPropertyName = "HinhPhat";

                    DataGridViewTextBoxColumn colNgayPhat = new DataGridViewTextBoxColumn();
                    colNgayPhat.HeaderText = "Ngày phạt";
                    colNgayPhat.DataPropertyName = "NgayPhat";
                    colNgayPhat.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colHanPhat = new DataGridViewTextBoxColumn();
                    colHanPhat.HeaderText = "Hạn phạt";
                    colHanPhat.DataPropertyName = "HanPhat";
                    colHanPhat.DefaultCellStyle.Format = "dd/MM/yyyy";

                    if (dgvPhat.Columns.Count == 0)
                        dgvPhat.Columns.AddRange(new DataGridViewColumn[] { colMaPhat, colMaDG, colMaSachP, colLoaiPhat, colHinhPhat, colNgayPhat, colHanPhat });

                    // Lấy DS Phat
                    ActionResultAsList<Phat> rsPhat = new PhatManager().LayDS();
                    if (rsPhat.Success)
                        dgvPhat.DataSource = new BindingListView<Phat>(rsPhat.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rsPhat.Exceptions[rsPhat.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvPhat);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvPhat.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLNguoiDungTab":
                    #region Cài đặt dgvNguoiDung
                    // Cài đặt các thuộc tính cần thiết
                    dgvNguoiDung.ContextMenuStrip = this.cmsQLNguoiDung;
                    dgvNguoiDung.AllowUserToAddRows = false;
                    dgvNguoiDung.AllowUserToDeleteRows = false;
                    dgvNguoiDung.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvNguoiDung.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvNguoiDung.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvNguoiDung.Dock = DockStyle.Fill;
                    dgvNguoiDung.MultiSelect = false;
                    dgvNguoiDung.ReadOnly = true;
                    dgvNguoiDung.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvNguoiDung.AutoGenerateColumns = false;
                    // Tạo các cột cần thiết
                    DataGridViewTextBoxColumn colMaNguoiDung = new DataGridViewTextBoxColumn();
                    colMaNguoiDung.HeaderText = "Mã người dùng";
                    colMaNguoiDung.DataPropertyName = "MaNguoiDung";
                    colMaNguoiDung.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colHoTen = new DataGridViewTextBoxColumn();
                    colHoTen.HeaderText = "Họ và tên";
                    colHoTen.DataPropertyName = "HoTen";

                    DataGridViewCheckBoxColumn colGioiTinh = new DataGridViewCheckBoxColumn();
                    colGioiTinh.HeaderText = "Giới tính";
                    colGioiTinh.DataPropertyName = "GioiTinh";

                    DataGridViewTextBoxColumn colNgaySinh = new DataGridViewTextBoxColumn();
                    colNgaySinh.HeaderText = "Ngày sinh";
                    colNgaySinh.DataPropertyName = "NgaySinh";
                    colNgaySinh.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colTaiKhoan = new DataGridViewTextBoxColumn();
                    colTaiKhoan.HeaderText = "Tài khoản";
                    colTaiKhoan.DataPropertyName = "TaiKhoan";

                    DataGridViewTextBoxColumn colMatKhau = new DataGridViewTextBoxColumn();
                    colMatKhau.HeaderText = "Mật khẩu";
                    colMatKhau.DataPropertyName = "MatKhau";

                    if (dgvNguoiDung.Columns.Count == 0)
                        dgvNguoiDung.Columns.AddRange(new DataGridViewColumn[] { colMaNguoiDung, colHoTen, colGioiTinh, colNgaySinh, colTaiKhoan, colMatKhau });

                    // Lấy DS người dùng
                    ActionResultAsList<NguoiDung> rsNguoiDung = new NguoiDungManager().LayDS();
                    if (rsNguoiDung.Success)
                        dgvNguoiDung.DataSource = new BindingListView<NguoiDung>(rsNguoiDung.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rsNguoiDung.Exceptions[rsNguoiDung.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvNguoiDung);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvNguoiDung.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLTaiKhoanTab":
                    pnlDSHienThi.Controls.Clear();
                    lblTongSoDong.Text = "";
                    progressBarHT.Visible = false;
                    break;
                case "QLHeThongTab":
                    pnlDSHienThi.Controls.Clear();
                    progressBarHT.Visible = true;
                    lblTongSoDong.Text = "";
                    TrangThaiBar.Refresh();
                    break;
                case "QLSachTab":
                    #region Cài đặt dgvSach
                    // Cài đặt các thuộc tính cần thiết
                    dgvSach.ContextMenuStrip = this.cmsQLSach;
                    dgvSach.AllowUserToAddRows = false;
                    dgvSach.AllowUserToDeleteRows = false;
                    dgvSach.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvSach.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvSach.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvSach.Dock = DockStyle.Fill;
                    dgvSach.MultiSelect = false;
                    dgvSach.ReadOnly = true;
                    dgvSach.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvSach.AutoGenerateColumns = false;

                    // Tạo các cột
                    DataGridViewTextBoxColumn colMaSach = new DataGridViewTextBoxColumn();
                    colMaSach.HeaderText = "Mã sách";
                    colMaSach.DataPropertyName = "MaSach";
                    colMaSach.Name = "MaSach";
                    colMaSach.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colTenSach = new DataGridViewTextBoxColumn();
                    colTenSach.HeaderText = "Tên sách";
                    colTenSach.DataPropertyName = "TenSach";
                    colTenSach.Name = "TenSach";

                    DataGridViewTextBoxColumn colNXB = new DataGridViewTextBoxColumn();
                    colNXB.HeaderText = "NXB";
                    colNXB.DataPropertyName = "NXB";
                    colNXB.Name = "NXB";

                    DataGridViewTextBoxColumn colTheLoai = new DataGridViewTextBoxColumn();
                    colTheLoai.HeaderText = "Thể loại";
                    colTheLoai.DataPropertyName = "TheLoai";
                    colTheLoai.Name = "TheLoai";

                    DataGridViewTextBoxColumn colTacGia = new DataGridViewTextBoxColumn();
                    colTacGia.HeaderText = "Tác giả";
                    colTacGia.DataPropertyName = "TacGia";
                    colTacGia.Name = "TacGia";

                    DataGridViewTextBoxColumn colSoTrang = new DataGridViewTextBoxColumn();
                    colSoTrang.HeaderText = "Số trang";
                    colSoTrang.DataPropertyName = "SoTrang";
                    colSoTrang.Name = "SoTrang";

                    DataGridViewTextBoxColumn colNamNXB = new DataGridViewTextBoxColumn();
                    colNamNXB.HeaderText = "Năm XB";
                    colNamNXB.DataPropertyName = "NamXB";
                    colNamNXB.Name = "NamXB";

                    DataGridViewTextBoxColumn colGia = new DataGridViewTextBoxColumn();
                    colGia.HeaderText = "Giá";
                    colGia.DataPropertyName = "Gia";
                    colGia.Name = "Gia";

                    DataGridViewTextBoxColumn colNgayNhap = new DataGridViewTextBoxColumn();
                    colNgayNhap.HeaderText = "Ngày nhập";
                    colNgayNhap.DataPropertyName = "NgayNhap";
                    colNgayNhap.Name = "NgayNhap";
                    colNgayNhap.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colTrangThai = new DataGridViewTextBoxColumn();
                    colTrangThai.HeaderText = "Trạng thái";
                    colTrangThai.DataPropertyName = "TrangThai";
                    colTrangThai.Name = "TrangThai";

                    if (dgvSach.Columns.Count == 0)
                        dgvSach.Columns.AddRange(new DataGridViewColumn[] { colMaSach, colTenSach, colNXB, colTheLoai, colTacGia, colSoTrang, colNamNXB, colGia, colNgayNhap, colTrangThai });
                    // Lấy DS sách
                    SachManager sach = new SachManager();
                    ActionResultAsList<Sach> ar = sach.LayDSSach();
                    if (ar.Success)
                        dgvSach.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + ar.Exceptions[ar.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvSach);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSach.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLTheLoaiTab":
                    #region Cài đặt dgvTheLoai
                    // Cài đặt các thuộc tính cần thiết
                    dgvTheLoai.ContextMenuStrip = this.cmsQLTheLoai;
                    dgvTheLoai.AllowUserToAddRows = false;
                    dgvTheLoai.AllowUserToDeleteRows = false;
                    dgvTheLoai.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvTheLoai.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvTheLoai.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvTheLoai.Dock = DockStyle.Fill;
                    dgvTheLoai.MultiSelect = false;
                    dgvTheLoai.ReadOnly = true;
                    dgvTheLoai.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvTheLoai.AutoGenerateColumns = false;

                    // Tạo các cột
                    DataGridViewTextBoxColumn colMaTheLoai = new DataGridViewTextBoxColumn();
                    colMaTheLoai.HeaderText = "Mã thể loại";
                    colMaTheLoai.DataPropertyName = "MaTheLoai";
                    colMaTheLoai.Name = "MaTheLoai";
                    colMaTheLoai.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colTenTheLoai = new DataGridViewTextBoxColumn();
                    colTenTheLoai.HeaderText = "Tên thể loại";
                    colTenTheLoai.DataPropertyName = "TenTheLoai";
                    colTenTheLoai.Name = "TenTheLoai";

                    DataGridViewTextBoxColumn colMoTa = new DataGridViewTextBoxColumn();
                    colMoTa.HeaderText = "Mô tả";
                    colMoTa.DataPropertyName = "MoTa";
                    colMoTa.Name = "MoTa";


                    if (dgvTheLoai.Columns.Count == 0)
                        dgvTheLoai.Columns.AddRange(new DataGridViewColumn[] { colMaTheLoai, colTenTheLoai, colMoTa });
                    // Lấy DS sách
                    TheLoaiManager theloai = new TheLoaiManager();
                    ActionResultAsList<TheLoai> artl = theloai.LayDSTheLoai();
                    if (artl.Success)
                        dgvTheLoai.DataSource = new BindingListView<TheLoai>(artl.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + artl.Exceptions[artl.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvTheLoai);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTheLoai.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLNXBTab":
                    #region Cài đặt dgvNXB
                    // Cài đặt các thuộc tính cần thiết
                    dgvNXB.ContextMenuStrip = this.cmsQLNXB;
                    dgvNXB.AllowUserToAddRows = false;
                    dgvNXB.AllowUserToDeleteRows = false;
                    dgvNXB.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvNXB.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvNXB.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvNXB.Dock = DockStyle.Fill;
                    dgvNXB.MultiSelect = false;
                    dgvNXB.ReadOnly = true;
                    dgvNXB.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvNXB.AutoGenerateColumns = false;

                    // Tạo các cột
                    DataGridViewTextBoxColumn colMaNXB = new DataGridViewTextBoxColumn();
                    colMaNXB.HeaderText = "Mã NXB";
                    colMaNXB.DataPropertyName = "MaNXB";
                    colMaNXB.Name = "MaNXB";
                    colMaNXB.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colTenNXB = new DataGridViewTextBoxColumn();
                    colTenNXB.HeaderText = "Tên NXB";
                    colTenNXB.DataPropertyName = "TenNXB";
                    colTenNXB.Name = "TenNXB";

                    DataGridViewTextBoxColumn colMoTaNXB = new DataGridViewTextBoxColumn();
                    colMoTaNXB.HeaderText = "Mô tả";
                    colMoTaNXB.DataPropertyName = "MoTa";
                    colMoTaNXB.Name = "MoTa";


                    if (dgvNXB.Columns.Count == 0)
                        dgvNXB.Columns.AddRange(new DataGridViewColumn[] { colMaNXB, colTenNXB, colMoTaNXB });
                    // Lấy DS sách
                    NXBManager nxb = new NXBManager();
                    ActionResultAsList<NXB> arnxb = nxb.LayDSNXB();
                    if (arnxb.Success)
                        dgvNXB.DataSource = new BindingListView<NXB>(arnxb.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + arnxb.Exceptions[arnxb.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvNXB);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvNXB.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "QLDocGiaTab":
                    #region Cài đặt dgvDocGia
                    // Cài đặt các thuộc tính cần thiết
                    dgvDocGia.AllowUserToAddRows = false;
                    dgvDocGia.AllowUserToDeleteRows = false;
                    dgvDocGia.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvDocGia.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvDocGia.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvDocGia.Dock = DockStyle.Fill;
                    dgvDocGia.MultiSelect = false;
                    dgvDocGia.ReadOnly = true;
                    dgvDocGia.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvDocGia.AutoGenerateColumns = false;
                    dgvDocGia.ContextMenuStrip = cmsQLDocGia;

                    // Tạo các cột cần thiết
                    DataGridViewTextBoxColumn colMaDocGia1 = new DataGridViewTextBoxColumn();
                    colMaDocGia1.HeaderText = "Mã độc giả";
                    colMaDocGia1.DataPropertyName = "MaDocGia";
                    colMaDocGia1.Name = "MaDocGia";
                    colMaDocGia1.DefaultCellStyle.Format = "0000000";

                    DataGridViewTextBoxColumn colHT = new DataGridViewTextBoxColumn();
                    colHT.HeaderText = "Họ tên";
                    colHT.DataPropertyName = "HoTen";
                    colHT.Name = "HoTen";

                    DataGridViewTextBoxColumn colGioiTinhDG = new DataGridViewTextBoxColumn();
                    colGioiTinhDG.HeaderText = "Giới tính";
                    colGioiTinhDG.DataPropertyName = "GioiTinh";
                    colGioiTinhDG.Name = "GioiTinh";

                    DataGridViewTextBoxColumn colNgaySinhDG = new DataGridViewTextBoxColumn();
                    colNgaySinhDG.HeaderText = "Ngày sinh";
                    colNgaySinhDG.DataPropertyName = "NgaySinh";
                    colNgaySinhDG.Name = "NgaySinh";
                    colNgaySinhDG.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colNgayLapThe = new DataGridViewTextBoxColumn();
                    colNgayLapThe.HeaderText = "Ngày lập thẻ";
                    colNgayLapThe.DataPropertyName = "NgayLapThe";
                    colNgayLapThe.Name = "NgayLapThe";
                    colNgayLapThe.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colTrangThaiDG = new DataGridViewTextBoxColumn();
                    colTrangThaiDG.HeaderText = "Trạng thái";
                    colTrangThaiDG.DataPropertyName = "TrangThai";
                    colTrangThaiDG.Name = "TrangThai";

                    if (dgvDocGia.Columns.Count == 0)
                        dgvDocGia.Columns.AddRange(new DataGridViewColumn[] { colMaDocGia1, colHT, colGioiTinhDG, colNgaySinhDG, colNgayLapThe, colTrangThaiDG });

                    // Lấy DS PhieuMuon
                    ActionResultAsList<DocGia> rsdg = new DocGiaManager().LayDSDG();
                    if (rsdg.Success)
                        dgvDocGia.DataSource = new BindingListView<DocGia>(rsdg.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rsdg.Exceptions[rsdg.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    #endregion
                    // Đưa dgv vào panel
                    if (radMaDG.Checked == true)
                    {
                        cbbTKTen.Visible = false;
                        cbbTKTT.Visible = false;
                        cbbTKMa.Visible = true;
                        cbbTKMa.DataSource = new DocGiaManager().LayDSDG().ObjectList;
                        cbbTKMa.DisplayMember = "MaDocGia";
                    }
                    if (radTenDG.Checked == true)
                    {
                        cbbTKMa.Visible = false;
                        cbbTKTT.Visible = false;
                        cbbTKTen.Visible = true;
                        cbbTKTen.DataSource = new DocGiaManager().LayDSDG().ObjectList;
                        cbbTKTen.DisplayMember = "HoTen";
                    }
                    if (radTrangThaiDG.Checked == true)
                    {
                        cbbTKTen.Visible = false;
                        cbbTKMa.Visible = false;
                        cbbTKTT.Visible = true;
                    }
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvDocGia);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "TraCuuSachTab":
                    #region Cài đặt dgvTraCuuSach
                    // Cài đặt các thuộc tính cần thiết
                    dgvTraCuuSach.AllowUserToAddRows = false;
                    dgvTraCuuSach.AllowUserToDeleteRows = false;
                    dgvTraCuuSach.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dgvTraCuuSach.BackgroundColor = Color.FromArgb(76, 133, 188);
                    dgvTraCuuSach.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                    dgvTraCuuSach.Dock = DockStyle.Fill;
                    dgvTraCuuSach.MultiSelect = false;
                    dgvTraCuuSach.ReadOnly = true;
                    dgvTraCuuSach.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    dgvTraCuuSach.AutoGenerateColumns = false;

                    // Tạo các cột
                    DataGridViewTextBoxColumn colMaSachTC = new DataGridViewTextBoxColumn();
                    colMaSachTC.HeaderText = "Mã sách";
                    colMaSachTC.DataPropertyName = "MaSach";
                    colMaSachTC.Name = "MaSach";
                    colMaSachTC.DefaultCellStyle.Format = "00000";

                    DataGridViewTextBoxColumn colTenSachTC = new DataGridViewTextBoxColumn();
                    colTenSachTC.HeaderText = "Tên sách";
                    colTenSachTC.DataPropertyName = "TenSach";
                    colTenSachTC.Name = "TenSach";

                    DataGridViewTextBoxColumn colNXBTC = new DataGridViewTextBoxColumn();
                    colNXBTC.HeaderText = "NXB";
                    colNXBTC.DataPropertyName = "NXB";
                    colNXBTC.Name = "NXB";

                    DataGridViewTextBoxColumn colTheLoaiTC = new DataGridViewTextBoxColumn();
                    colTheLoaiTC.HeaderText = "Thể loại";
                    colTheLoaiTC.DataPropertyName = "TheLoai";
                    colTheLoaiTC.Name = "TheLoai";

                    DataGridViewTextBoxColumn colTacGiaTC = new DataGridViewTextBoxColumn();
                    colTacGiaTC.HeaderText = "Tác giả";
                    colTacGiaTC.DataPropertyName = "TacGia";
                    colTacGiaTC.Name = "TacGia";

                    DataGridViewTextBoxColumn colSoTrangTC = new DataGridViewTextBoxColumn();
                    colSoTrangTC.HeaderText = "Số trang";
                    colSoTrangTC.DataPropertyName = "SoTrang";
                    colSoTrangTC.Name = "SoTrang";

                    DataGridViewTextBoxColumn colNamNXBTC = new DataGridViewTextBoxColumn();
                    colNamNXBTC.HeaderText = "Năm XB";
                    colNamNXBTC.DataPropertyName = "NamXB";
                    colNamNXBTC.Name = "NamXB";

                    DataGridViewTextBoxColumn colGiaTC = new DataGridViewTextBoxColumn();
                    colGiaTC.HeaderText = "Giá";
                    colGiaTC.DataPropertyName = "Gia";
                    colGiaTC.Name = "Gia";

                    DataGridViewTextBoxColumn colNgayNhapTC = new DataGridViewTextBoxColumn();
                    colNgayNhapTC.HeaderText = "Ngày nhập";
                    colNgayNhapTC.DataPropertyName = "NgayNhap";
                    colNgayNhapTC.Name = "NgayNhap";
                    colNgayNhapTC.DefaultCellStyle.Format = "dd/MM/yyyy";

                    DataGridViewTextBoxColumn colTrangThaiTC = new DataGridViewTextBoxColumn();
                    colTrangThaiTC.HeaderText = "Trạng thái";
                    colTrangThaiTC.DataPropertyName = "TrangThai";
                    colTrangThaiTC.Name = "TrangThai";

                    if (dgvTraCuuSach.Columns.Count == 0)
                        dgvTraCuuSach.Columns.AddRange(new DataGridViewColumn[] { colMaSachTC, colTenSachTC, colNXBTC, colTheLoaiTC, colTacGiaTC, colSoTrangTC, colNamNXBTC, colGiaTC, colNgayNhapTC, colTrangThaiTC });
                    #endregion
                    // Đưa dgv vào panel
                    if (radTenS.Checked)
                    {
                        cbbTimTenS.Visible = true;
                        cbbTimTG.Visible = false;
                        cbbTimNXB.Visible = false;
                        cbbTimTL.Visible = false;
                        cbbTimTenS.Items.Clear();
                        var list = new SachManager().LayDSSach().ObjectList;
                        foreach (var item in list)
                        {
                            if (!cbbTimTenS.Items.Contains(item.TenSach))
                                cbbTimTenS.Items.Add(item.TenSach);
                        }
                    }
                    if (radTacGia.Checked)
                    {
                        cbbTimTenS.Visible = false;
                        cbbTimTG.Visible = true;
                        cbbTimNXB.Visible = false;
                        cbbTimTL.Visible = false;
                        cbbTimTG.Items.Clear();
                        var list = new SachManager().LayDSSach().ObjectList;
                        foreach (var item in list)
                        {
                            if (!cbbTimTG.Items.Contains(item.TacGia))
                                cbbTimTG.Items.Add(item.TacGia);
                        }
                    }
                    if (radNhaXuatBan.Checked)
                    {
                        cbbTimTenS.Visible = false;
                        cbbTimTG.Visible = false;
                        cbbTimNXB.Visible = true;
                        cbbTimTL.Visible = false;
                        cbbTimNXB.DataSource = new NXBManager().LayDSNXB().ObjectList;
                        cbbTimNXB.DisplayMember = "TenNXB";
                    }
                    if (radTheLoai.Checked)
                    {
                        cbbTimTenS.Visible = false;
                        cbbTimTG.Visible = false;
                        cbbTimNXB.Visible = false;
                        cbbTimTL.Visible = true;
                        cbbTimTL.DataSource = new TheLoaiManager().LayDSTheLoai().ObjectList;
                        cbbTimTL.DisplayMember = "TenTheLoai";
                    }
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvTraCuuSach);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTraCuuSach.RowCount;
                    progressBarHT.Visible = false;
                    TrangThaiBar.Refresh();
                    break;
                case "ThongKeBaoCaoTab":
                    cbbNam.Items.Clear();
                    for (int i = 2000; i <= 2014; i++)
                    {
                        cbbNam.Items.Add(i);
                    }
                    CaiDatdgvSachBC();
                    pnlDSHienThi.Controls.Clear();
                    pnlDSHienThi.Controls.Add(dgvSachBC);
                    break;
                default:
                    pnlDSHienThi.Controls.Clear();
                    progressBarHT.Visible = false;
                    lblTongSoDong.Text = "";
                    TrangThaiBar.Refresh();
                    break;
            }
        }

        #region Nghiêm Xuân Huy's code
        private void btnSaoLuu_Click(object sender, EventArgs e)
        {
            folderDialogBackup.ShowDialog();
            string path = Path.Combine(folderDialogBackup.SelectedPath, "ThuVien[" + DateTime.Now.ToShortDateString().Replace('/', '-') + "].bak");
            if (folderDialogBackup.SelectedPath != "")
            {
                HeThongManager mgr = new HeThongManager();
                mgr.prcs = new ProcessHeThong(ProcessHT);
                ActionResult rs = mgr.SaoLuu(path);
                if (rs.Success)
                {
                    MessageBox.Show("Sao lưu thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Sao lưu thất bại!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                progressBarHT.Value = 0;
            }
        }

        private void btnPhucHoi_Click(object sender, EventArgs e)
        {
            if (openFileDialogHT.ShowDialog() == DialogResult.OK)
            {
                string path = openFileDialogHT.FileName;
                HeThongManager mgr = new HeThongManager();
                mgr.prcs = new ProcessHeThong(ProcessHT);
                ActionResult rs = mgr.PhucHoi(path);
                if (rs.Success)
                {
                    MessageBox.Show("Phục hồi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Phục hồi thất bại!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                progressBarHT.Value = 0;
            }
        }

        private void ProcessHT(int percent)
        {
            progressBarHT.Value = percent;
        }

        private void btnInPhieuMuon_Click(object sender, EventArgs e)
        {
            if (dgvPhieuMuon.SelectedRows.Count != 0)
            {
                int maPM = Convert.ToInt32(dgvPhieuMuon.SelectedRows[0].Cells["MaPhieuMuon"].Value);
                if (MessageBox.Show(String.Format("Bạn muốn in phiếu mượn mã {0:00000}?", maPM), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<PhieuMuon> l = (dgvPhieuMuon.DataSource as BindingListView<PhieuMuon>).DataSource as List<PhieuMuon>;
                    PhieuMuon pm = l.Find(p => p.MaPhieuMuon == maPM);
                    InPhieuMuonForm fIn = new InPhieuMuonForm();
                    fIn.PhieuMuon = pm;
                    fIn.CTPhieuMuon = new MuonSachManager().LayCTPMTheoMaPM(maPM).ObjectList;
                    fIn.ShowDialog();
                }
            }
        }

        private void btnLoadMS_Click(object sender, EventArgs e)
        {
            ActionResultAsList<PhieuMuon> rs = new MuonSachManager().LayToanBoPM();
            if (rs.Success)
                HienThiDSPhieuMuon(rs.ObjectList);
            else
                MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void btnXoaMS_Click(object sender, EventArgs e)
        {
            if (dgvPhieuMuon.SelectedRows.Count != 0)
            {
                int maPM = Convert.ToInt32(dgvPhieuMuon.SelectedRows[0].Cells["MaPhieuMuon"].Value);
                if (MessageBox.Show(String.Format("Bạn muốn xóa phiếu mượn mã {0:00000}?", maPM), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<PhieuMuon> l = (dgvPhieuMuon.DataSource as BindingListView<PhieuMuon>).DataSource as List<PhieuMuon>;
                    PhieuMuon pm = l.Find(p => p.MaPhieuMuon == maPM);
                    ActionResult rs = new MuonSachManager().XoaPhieuMuon(pm);
                    if (rs.Success)
                    {
                        CapNhatDSPhieuMuon(LoaiHanhDong.Xoa, pm);
                        MessageBox.Show("Xóa thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                        MessageBox.Show("Xóa thất bại!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void CapNhatDSPhieuMuon(LoaiHanhDong hd, PhieuMuon pm)
        {
            List<PhieuMuon> list = (dgvPhieuMuon.DataSource as BindingListView<PhieuMuon>).DataSource as List<PhieuMuon>;
            switch (hd)
            {
                case LoaiHanhDong.Them:
                    list.Add(pm);
                    dgvPhieuMuon.DataSource = new BindingListView<PhieuMuon>(list);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvPhieuMuon.RowCount;
                    break;
                case LoaiHanhDong.Xoa:
                    dgvPhieuMuon.Rows.Remove(dgvPhieuMuon.SelectedRows[0]);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvPhieuMuon.RowCount;
                    break;
                case LoaiHanhDong.CapNhat:
                    int index = list.FindIndex(p => p.MaPhieuMuon == pm.MaPhieuMuon);
                    list[index] = pm;
                    dgvPhieuMuon.DataSource = new BindingListView<PhieuMuon>(list);
                    break;
                default:
                    break;
            }
        }

        void dgvPhieuMuon_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            TTCTMuonSachForm f = new TTCTMuonSachForm();
            int maPM = Convert.ToInt32(dgvPhieuMuon.SelectedRows[0].Cells["MaPhieuMuon"].Value);
            List<PhieuMuon> l = (dgvPhieuMuon.DataSource as BindingListView<PhieuMuon>).DataSource as List<PhieuMuon>;
            PhieuMuon pm = l.Find(p => p.MaPhieuMuon == maPM);
            f.PhieuMuon = pm;
            List<ChiTietPhieuMuon> lct = new List<ChiTietPhieuMuon>();
            foreach (var item in pm.ChiTietPhieuMuons)
            {
                lct.Add(item);
            }
            f.DsCTPM = lct;
            f.ShowDialog();
        }

        private void btnThemMS_Click(object sender, EventArgs e)
        {
            CapNhatTTMuonSachForm f = new CapNhatTTMuonSachForm();
            f.PhuongThucCapNhatDS = new CapNhatDS(CapNhatDSPhieuMuon);
            f.ShowDialog();
        }

        private void btnCapNhatMS_Click(object sender, EventArgs e)
        {
            CapNhatTTMuonSachForm f = new CapNhatTTMuonSachForm();
            f.MaPM = Convert.ToInt32(dgvPhieuMuon.SelectedRows[0].Cells["MaPhieuMuon"].Value);
            f.PhuongThucCapNhatDS = new CapNhatDS(CapNhatDSPhieuMuon);
            f.ShowDialog();
        }

        private void HienThiDSPhieuMuon(List<PhieuMuon> l)
        {
            if (l.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                dgvPhieuMuon.DataSource = new BindingListView<PhieuMuon>(l);
                lblTongSoDong.Text = "Tổng số dòng: " + dgvPhieuMuon.RowCount;
            }
        }

        private void btnTimKiemMS_Click(object sender, EventArgs e)
        {
            int thongTin;
            ActionResultAsList<PhieuMuon> rs = new ActionResultAsList<PhieuMuon>();
            string text = txtTimKiemMS.Text.Trim().Replace(".", "").Replace(",", "").Replace("-", "");
            txtTimKiemMS.Text = text;
            if (text == "")
            {
                MessageBox.Show("Chưa nhập thông tin tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtTimKiemMS.Focus();
            }
            else
                if (!int.TryParse(text, out thongTin))
                {
                    MessageBox.Show("Vui lòng nhập số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    txtTimKiemMS.Focus();
                }
                else
                {
                    if (radTimTheoMaPM.Checked)
                        rs = new MuonSachManager().TimPMTheoMaPM(thongTin);
                    else
                        if (text.Length != 7)
                        {
                            MessageBox.Show("Vui lòng nhập 7 chữ số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            txtTimKiemMS.Focus();
                            return;
                        }
                        else
                            rs = new MuonSachManager().TimPMTheoMaDG(txtTimKiemMS.Text);
                    if (rs.Success)
                        HienThiDSPhieuMuon(rs.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
        }

        private void tsmiThemMS_Click(object sender, EventArgs e)
        {
            btnThemMS_Click(btnThemMS, new EventArgs());
        }

        private void tsmiXoaMS_Click(object sender, EventArgs e)
        {
            btnXoaMS_Click(btnXoaMS, new EventArgs());
        }

        private void tsmiSuaMS_Click(object sender, EventArgs e)
        {
            btnCapNhatMS_Click(btnCapNhatMS, new EventArgs());
        }

        private void tsmiInMS_Click(object sender, EventArgs e)
        {
            btnInPhieuMuon_Click(btnInPhieuMuon, new EventArgs());
        }

        void dgvPhieuMuon_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
                this.btnXoaMS_Click(btnXoaMS, new EventArgs());
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
        #endregion

        #region Nguyễn Minh Tuấn's code

        #region Quản lý phạt

        void dgvPhat_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Delete)
                this.btnXoaPhat_Click(btnXoaPhat, new EventArgs());
        }

        private void LoadDSPhat(Phat phat)
        {
            var list = (dgvPhat.DataSource as BindingListView<Phat>).DataSource as List<Phat>;
            list.Add(phat);
            dgvPhat.DataSource = new BindingListView<Phat>(list);
            lblTongSoDong.Text = "Tổng số dòng: " + dgvPhat.RowCount;
        }

        private void btnThemPhat_Click(object sender, EventArgs e)
        {
            CapNhatPhatForm phatForm = new CapNhatPhatForm(LoadDSPhat);
            phatForm.ShowDialog();
        }

        private void btnXoaPhat_Click(object sender, EventArgs e)
        {
            if (dgvPhat.SelectedRows.Count > 0)
            {
                int id = int.Parse(dgvPhat.SelectedRows[0].Cells[0].Value.ToString());
                DialogResult dlg = MessageBox.Show("Bạn có muốn xóa phạt có mã là " + id + " hay không?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    PhatManager pm = new PhatManager();
                    var re = pm.Xoa(id);
                    if (re.Success)
                    {
                        var list = (dgvPhat.DataSource as BindingListView<Phat>).DataSource as List<Phat>;
                        list.RemoveAt(dgvPhat.SelectedRows[0].Index);
                        dgvPhat.DataSource = new BindingListView<Phat>(list);
                        lblTongSoDong.Text = "Tổng số dòng: " + dgvPhat.RowCount;
                        MessageBox.Show("Xóa phạt thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else MessageBox.Show("\nChi tiết: \n" + re.ToString(), "Xảy ra lỗi", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
            }
            else MessageBox.Show("Bạn chưa chọn phạt muốn xóa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void btnLoadDSPhat_Click(object sender, EventArgs e)
        {
            var list = new PhatManager().LayDS();
            if (list.Success)
            {
                this.dgvPhat.DataSource = new BindingListView<Phat>(list.ObjectList);
                lblTongSoDong.Text = "Tổng số dòng: " + dgvPhat.RowCount;
            }
            else MessageBox.Show("\nChi tiết: \n" + list.ToString(), "Xảy ra lỗi", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
        }

        private void btnTimPhat_Click(object sender, EventArgs e)
        {
            ValidateResult vr = new ValidateResult();
            if (txtTKPhat.Text != "")
            {
                if (this.radTPMaDG.Checked)
                {
                    int i;
                    if (!int.TryParse(txtTKPhat.Text, out i))
                        vr.AddMessage("Vui lòng nhập số!!!");
                    if (txtTKPhat.Text.Length != 7)
                        vr.AddMessage("Mã độc giả không đúng 7 ký tự!!!");
                    if (vr.Valid)
                    {
                        var re = new PhatManager().TimTheoMaDG(this.txtTKPhat.Text);
                        if (re.Success)
                            HienThiDSTKPhat(re.ObjectList);
                        else MessageBox.Show(re.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else MessageBox.Show(vr.ToString(), "Không hợp lệ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    var re = new PhatManager().TimTheoMaSach(this.txtTKPhat.Text);
                    if (re.Success)
                        HienThiDSTKPhat(re.ObjectList);
                    else MessageBox.Show(re.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else MessageBox.Show("Chưa nhập thông tin tìm kiếm!!!", "Không hợp lệ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void HienThiDSTKPhat(List<Phat> list)
        {
            if (list.Count > 0)
            {
                this.dgvPhat.DataSource = new BindingListView<Phat>(list);
                lblTongSoDong.Text = "Tổng số dòng: " + dgvPhat.RowCount;
            }
            else MessageBox.Show("Không tìm thấy kết quả.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        #endregion

        #region Quản lý người dùng

        void dgvNguoiDung_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Delete)
                this.btnXoaND_Click(btnXoaND, new EventArgs());
        }

        private void LoadDSNguoiDung(NguoiDung ngDung)
        {
            var list = (dgvNguoiDung.DataSource as BindingListView<NguoiDung>).DataSource as List<NguoiDung>;
            var nd = list.Find(n => n.MaNguoiDung == ngDung.MaNguoiDung);
            if (nd != null)
            {
                nd.HoTen = ngDung.HoTen;
                nd.TaiKhoan = ngDung.TaiKhoan;
                nd.MatKhau = ngDung.MatKhau;
                nd.GioiTinh = ngDung.GioiTinh;
                nd.NgaySinh = ngDung.NgaySinh;
            }
            else
                list.Add(ngDung);
            dgvNguoiDung.DataSource = new BindingListView<NguoiDung>(list);
            lblTongSoDong.Text = "Tổng số dòng: " + dgvNguoiDung.RowCount;
        }

        private void btnThemND_Click(object sender, EventArgs e)
        {
            CapNhatNguoiDungForm cf = new CapNhatNguoiDungForm(LoadDSNguoiDung);
            cf.Show();
        }

        private void btnXoaND_Click(object sender, EventArgs e)
        {
            if (dgvNguoiDung.SelectedRows.Count > 0)
            {
                int id = int.Parse(dgvNguoiDung.SelectedRows[0].Cells[0].Value.ToString());
                DialogResult dlg = MessageBox.Show("Bạn có muốn xóa người dùng có mã " + id + " hay không ?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    NguoiDungManager nm = new NguoiDungManager();
                    var re = nm.Xoa(id);
                    if (re.Success)
                    {
                        var list = (dgvNguoiDung.DataSource as BindingListView<NguoiDung>).DataSource as List<NguoiDung>;
                        list.RemoveAt(dgvNguoiDung.SelectedRows[0].Index);
                        dgvNguoiDung.DataSource = new BindingListView<NguoiDung>(list);
                        lblTongSoDong.Text = "Tổng số dòng: " + dgvNguoiDung.RowCount;
                        MessageBox.Show("Xóa người dùng thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else MessageBox.Show(re.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else MessageBox.Show("Bạn chưa chọn phạt muốn xóa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void btnSuaND_Click(object sender, EventArgs e)
        {
            var list = (dgvNguoiDung.DataSource as BindingListView<NguoiDung>).DataSource as List<NguoiDung>;
            var ngDung = list.Find(n => n.MaNguoiDung == int.Parse(dgvNguoiDung.SelectedRows[0].Cells[0].Value.ToString()));
            CapNhatNguoiDungForm cf = new CapNhatNguoiDungForm(ngDung, LoadDSNguoiDung);
            cf.Show();
        }

        private void btnLoadDSND_Click(object sender, EventArgs e)
        {
            var list = new NguoiDungManager().LayDS();
            if (list.Success)
            {
                this.dgvNguoiDung.DataSource = new BindingListView<NguoiDung>(list.ObjectList);
                lblTongSoDong.Text = "Tổng số dòng: " + dgvNguoiDung.RowCount;
            }
            else MessageBox.Show(list.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void btnTimND_Click(object sender, EventArgs e)
        {
            if (txtTimND.Text != "")
            {
                if (this.radTNDMa.Checked)
                {
                    int i;
                    if (int.TryParse(txtTimND.Text, out i))
                    {
                        var re = new NguoiDungManager().TimTheoMa(int.Parse(this.txtTimND.Text));
                        if (re.Success)
                            HienThiDSTKND(re.ObjectList);
                        else MessageBox.Show(re.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else MessageBox.Show("Vui lòng nhập số!!!", "Không hợp lệ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    var re = new NguoiDungManager().TimTheoTen(this.txtTimND.Text);
                    if (re.Success)
                        HienThiDSTKND(re.ObjectList);
                    else MessageBox.Show(re.ToString(), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else MessageBox.Show("Chưa nhập thông tin tìm kiếm!!!", "Không hợp lệ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void btnPhanQuyen_Click(object sender, EventArgs e)
        {
            CapNhatPhanQuyenForm cf = new CapNhatPhanQuyenForm(int.Parse(this.dgvNguoiDung.SelectedRows[0].Cells[0].Value.ToString()));
            cf.Show();
        }

        private void HienThiDSTKND(List<NguoiDung> list)
        {
            if (list.Count > 0)
            {
                this.dgvNguoiDung.DataSource = new BindingListView<NguoiDung>(list);
                lblTongSoDong.Text = "Tổng số dòng: " + dgvNguoiDung.RowCount;
            }
            else MessageBox.Show("Không tìm thấy kết quả.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        #endregion

        #region XL tai khoan

        private void AnChucNang()
        {
            this.QLDocGiaTab.Enabled = false;
            this.ThongKeBaoCaoTab.Enabled = false;
            this.QLSachTab.Enabled = false;
            this.QLTheLoaiTab.Enabled = false;
            this.QLNXBTab.Enabled = false;
            this.QLHeThongTab.Enabled = false;
            this.QLMuonSachTab.Enabled = false;
            this.QLPhatTab.Enabled = false;
            this.QLNguoiDungTab.Enabled = false;
            this.btnDangNhap.Enabled = true;
            this.btnDangXuat.Enabled = false;
            this.btnDoiMatKhau.Enabled = false;
        }
        private void HienChucNang(List<PhanQuyen> list)
        {
            foreach (var item in list)
            {
                switch (item.TenChucNang)
                {
                    case "Quản lý mượn sách":
                        if (item.KichHoat)
                            this.QLMuonSachTab.Enabled = true;
                        break;
                    case "Quản lý hệ thống":
                        if (item.KichHoat)
                            this.QLHeThongTab.Enabled = true;
                        break;
                    case "Quản lý sách":
                        if (item.KichHoat)
                            this.QLSachTab.Enabled = true;
                        break;
                    case "Quản lý độc giả":
                        if (item.KichHoat)
                            this.QLDocGiaTab.Enabled = true;
                        break;
                    case "Quản lý NXB":
                        if (item.KichHoat)
                            this.QLNXBTab.Enabled = true;
                        break;
                    case "Quản lý thể loại":
                        if (item.KichHoat)
                            this.QLTheLoaiTab.Enabled = true;
                        break;
                    case "Thống kê báo cáo":
                        if (item.KichHoat)
                            this.ThongKeBaoCaoTab.Enabled = true;
                        break;
                    case "Quản lý phạt":
                        if (item.KichHoat)
                            this.QLPhatTab.Enabled = true;
                        break;
                    case "Quản lý người dùng":
                        if (item.KichHoat)
                            this.QLNguoiDungTab.Enabled = true;
                        break;
                    case "Quản lý tài khoản":
                        if (item.KichHoat)
                            this.btnDoiMatKhau.Enabled = true;
                        break;
                }
                this.btnDangNhap.Enabled = false;
                this.btnDangXuat.Enabled = true;
                this.maNguoiDung = list[0].MaNguoiDung;
            }
        }
        void MainForm_Load(object sender, EventArgs e)
        {
            AnChucNang();
        }

        private void btnDangNhap_Click(object sender, EventArgs e)
        {
            DangNhapForm df = new DangNhapForm(HienChucNang);
            df.Show();
        }

        private void btnDangXuat_Click(object sender, EventArgs e)
        {
            DialogResult dlg = MessageBox.Show("Bạn có muốn đang xuất khỏi hệ thống!!!", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dlg == DialogResult.Yes)
            {
                AnChucNang();
                this.maNguoiDung = 0;
                MessageBox.Show("Bạn đã đăng xuất khỏi hệ thống", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnDoiMatKhau_Click(object sender, EventArgs e)
        {
            DoiMatKhauForm df = new DoiMatKhauForm(this.maNguoiDung);
            df.Show();
        }

        #endregion

        #endregion

        #region Tống Phước Anh Duy's code
        private void LoadDSDG(DocGia dg)
        {
            var l = (dgvDocGia.DataSource as BindingListView<DocGia>).DataSource as List<DocGia>;
            l.Add(dg);
            dgvDocGia.DataSource = new BindingListView<DocGia>(l);
        }

        private void btnThemDG_Click(object sender, EventArgs e)
        {
            CapNhatTTDocGiaForm f = new CapNhatTTDocGiaForm();
            f.MaDG = "";
            f.PhuongThucCapNhatDG = new CapNhatDG(CapNhatDSDocGia);
            f.ShowDialog();
        }

        private void btnSuaDG_Click(object sender, EventArgs e)
        {
            CapNhatTTDocGiaForm f = new CapNhatTTDocGiaForm();
            f.MaDG = Convert.ToString(dgvDocGia.SelectedRows[0].Cells["MaDocGia"].Value);
            f.PhuongThucCapNhatDG = new CapNhatDG(CapNhatDSDocGia);
            f.ShowDialog();
        }

        private void btnXoaDG_Click(object sender, EventArgs e)
        {
            if (dgvDocGia.SelectedRows.Count != 0)
            {
                string maDG = Convert.ToString(dgvDocGia.SelectedRows[0].Cells["MaDocGia"].Value);
                ActionResultAsList<PhieuMuon> ars = new MuonSachManager().LayToanBoPM();
                if (ars.Success)
                    foreach (var item in ars.ObjectList)
                    {
                        if (item.MaDocGia == maDG)
                        {
                            MessageBox.Show("Độc giả bị ràng buộc mượn sách!!!\n\nKhông thể xóa!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                    }
                ActionResultAsList<Phat> aral = new PhatManager().LayDS();
                if (aral.Success)
                    foreach (var item in aral.ObjectList)
                    {
                        if (item.MaDG == maDG)
                        {
                            MessageBox.Show("Độc giả bị ràng buộc phạt!!!\n\nKhông thể xóa!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                    }

                if (MessageBox.Show(String.Format("Bạn muốn xóa độc giả có mã độc giả {0:0000000}?", maDG), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<DocGia> l = (dgvDocGia.DataSource as BindingListView<DocGia>).DataSource as List<DocGia>;
                    DocGia dg = l.Find(s => s.MaDocGia == maDG);
                    ActionResult rs = new DocGiaManager().Xoa(dg.MaDocGia);
                    if (rs.Success)
                    {
                        CapNhatDSDocGia(LoaiHanhDong.Xoa, dg);
                        MessageBox.Show("Xóa độc giả thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                        MessageBox.Show("Xóa độc giả thất bại!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        void dgvDocGia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
                this.btnXoaDG_Click(btnXoaDG, new EventArgs());
        }

        private void CapNhatDSDocGia(LoaiHanhDong hd, DocGia dg)
        {
            List<DocGia> list = (dgvDocGia.DataSource as BindingListView<DocGia>).DataSource as List<DocGia>;
            switch (hd)
            {
                case LoaiHanhDong.Them:
                    list.Add(dg);
                    dgvDocGia.DataSource = new BindingListView<DocGia>(list);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                    break;
                case LoaiHanhDong.Xoa:
                    dgvDocGia.Rows.Remove(dgvDocGia.SelectedRows[0]);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                    break;
                case LoaiHanhDong.CapNhat:
                    int index = list.FindIndex(s => s.MaDocGia == dg.MaDocGia);
                    list[index] = dg;
                    dgvDocGia.DataSource = new BindingListView<DocGia>(list);
                    break;
                default:
                    break;
            }
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            ActionResultAsList<DocGia> rs = new DocGiaManager().LayDSDG();
            if (rs.Success)
                HienThiDSDG(rs.ObjectList);
            else
                MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        void dgvTraCuuSach_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            ChiTietSachForm f = new ChiTietSachForm();
            string maS = Convert.ToString(dgvTraCuuSach.SelectedRows[0].Cells["MaSach"].Value);
            List<Sach> l = (dgvTraCuuSach.DataSource as BindingListView<Sach>).DataSource as List<Sach>;
            Sach s = l.Find(p => p.MaSach == maS);
            f.Sach = s;
            f.ShowDialog();
        }

        private void btnTimKiemDG_Click(object sender, EventArgs e)
        {
            string tkten = cbbTKTen.Text;
            string tkma = " ";
            string tktt = cbbTKTT.Text;
            ActionResultAsList<DocGia> ar = new ActionResultAsList<DocGia>();
            if ((tkten == "") || (tkma == "") || (tktt == ""))
            {
                MessageBox.Show("Chưa nhập thông tin tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if (radTenDG.Checked == true)
                    cbbTKTen.Focus();
                if (radMaDG.Checked == true)
                    cbbTKMa.Focus();
                if (radTrangThaiDG.Checked == true)
                    cbbTKTT.Focus();
            }
            else
            {
                {
                    if (radTenDG.Checked)
                    {
                        ar = new DocGiaManager().TimKiemTheoTen(tkten);
                        dgvDocGia.DataSource = new BindingListView<DocGia>(ar.ObjectList);
                        lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                    }
                    if (radMaDG.Checked)
                    {
                        tkma = cbbTKMa.Text;
                        if (tkma.Length != 7)
                        {
                            MessageBox.Show("Vui lòng nhập 7 chữ số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            cbbTKMa.Focus();
                            return;
                        }
                        else
                        {
                            ar = new DocGiaManager().TimKiemTheoMa(tkma);
                            dgvDocGia.DataSource = new BindingListView<DocGia>(ar.ObjectList);
                            lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                        }
                        ar = new DocGiaManager().TimKiemTheoMa(tkma);
                    }
                    if (radTrangThaiDG.Checked)
                    {
                        ar = new DocGiaManager().TimKiemTheoTrangThai(tktt);
                        dgvDocGia.DataSource = new BindingListView<DocGia>(ar.ObjectList);
                        lblTongSoDong.Text = "Tổng số dòng: " + dgvDocGia.RowCount;
                    }
                    if (ar.Success)
                        HienThiDSDG(ar.ObjectList);
                    else
                        MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + ar.Exceptions[ar.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void HienThiDSDG(List<DocGia> l)
        {
            if (l.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvDocGia.DataSource = new BindingListView<DocGia>(l);
        }

        private void btnInDSDG_Click(object sender, EventArgs e)
        {
            if (dgvDocGia.SelectedRows.Count != 0)
            {

                if (MessageBox.Show(String.Format("Bạn muốn in danh sách độc giả không?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<DocGia> l = (dgvDocGia.DataSource as BindingListView<DocGia>).DataSource as List<DocGia>;
                    InDSDGForm fDSDG = new InDSDGForm();
                    fDSDG.DSDG = l;
                    fDSDG.ShowDialog();
                }
            }
        }

        private void btnInTheDG_Click(object sender, EventArgs e)
        {
            if (dgvDocGia.SelectedRows.Count != 0)
            {

                if (MessageBox.Show(String.Format("Bạn muốn in danh sách các độc giả cần lập thẻ?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    InTheDGForm fInTheDG = new InTheDGForm();
                    var list = new DocGiaManager().LayDGTheoTrangThai("Mới đăng ký").ObjectList;
                    fInTheDG.DSDG = list;
                    fInTheDG.ShowDialog();
                }
            }
        }

        private void btnTimKiemSach_Click(object sender, EventArgs e)
        {
            string timtens = cbbTimTenS.Text;
            string timTG = cbbTimTG.Text;
            string timNXB = cbbTimNXB.Text;
            string timTL = cbbTimTL.Text;
            ActionResultAsList<Sach> ar = new ActionResultAsList<Sach>();
            if (radTenS.Checked)
            {
                cbbTimTenS.Visible = true;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = false;
                ar = new SachManager().TimKiemSachTheoTen(timtens);
                if (ar.Success)
                {
                    HienThiTKS(ar.ObjectList);
                    dgvTraCuuSach.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTraCuuSach.RowCount;
                }
            }
            if (radTacGia.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = true;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = false;
                ar = new SachManager().TimKiemSachTheoTacGia(timTG);
                if (ar.Success)
                {
                    HienThiTKS(ar.ObjectList);
                    dgvTraCuuSach.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTraCuuSach.RowCount;
                }
            }
            if (radNhaXuatBan.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = true;
                cbbTimTL.Visible = false;
                ar = new SachManager().TimKiemSachTheoNXB(timNXB);
                if (ar.Success)
                {
                    HienThiTKS(ar.ObjectList);
                    dgvTraCuuSach.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTraCuuSach.RowCount;
                }
            }
            if (radTheLoai.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = true;
                ar = new SachManager().TimKiemSachTheoTheLoai(timTL);
                if (ar.Success)
                {
                    HienThiTKS(ar.ObjectList);
                    dgvTraCuuSach.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTraCuuSach.RowCount;
                }
            }
        }

        private void HienThiTKS(List<Sach> l)
        {
            if (l.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvTraCuuSach.DataSource = new BindingListView<Sach>(l);
        }

        private void btnBaoCao_Click(object sender, EventArgs e)
        {
            ActionResultAsList<Sach> ar = new ActionResultAsList<Sach>();
            ActionResultAsList<DocGia> ar1 = new ActionResultAsList<DocGia>();
            int thang = Convert.ToInt32(cbbThang.Text);
            int nam = Convert.ToInt32(cbbNam.Text);
            if (radSachDuocMuon.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
                ar = new MuonSachManager().LayDSSachDuocMuon(thang, nam);
                if (ar.Success)
                {
                    HienThiBCS(ar.ObjectList);
                    dgvSachBC.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSachBC.RowCount;
                }
            }
            if (radSachNhap.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
                ar = new SachManager().LayDSSachNhap(thang, nam);
                if (ar.Success)
                {
                    HienThiBCS(ar.ObjectList);
                    dgvSachBC.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSachBC.RowCount;
                }
            }
            if (radSachMat.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
                ar = new PhatManager().TimKiemSachMat(thang, nam);
                if (ar.Success)
                {
                    HienThiBCS(ar.ObjectList);
                    dgvSachBC.DataSource = new BindingListView<Sach>(ar.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSachBC.RowCount;
                }
            }
            if (radLapTheDocGia.Checked)
            {
                CaiDatdgvDGBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvDGBC);
                ar1 = new DocGiaManager().LayDSDocGiaLapThe(thang, nam);
                if (ar1.Success)
                {
                    HienThiDGBC(ar1.ObjectList);
                    dgvDGBC.DataSource = new BindingListView<DocGia>(ar1.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvDGBC.RowCount;
                }
            }
        }

        private void HienThiBCS(List<Sach> l)
        {
            if (l.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvSachBC.DataSource = new BindingListView<Sach>(l);
        }

        private void HienThiDGBC(List<DocGia> l)
        {
            if (l.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvDGBC.DataSource = new BindingListView<DocGia>(l);
        }

        private void CaiDatdgvSachBC()
        {
            #region Cài đặt dgvSachBC
            // Cài đặt các thuộc tính cần thiết
            dgvSachBC.AllowUserToAddRows = false;
            dgvSachBC.AllowUserToDeleteRows = false;
            dgvSachBC.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvSachBC.BackgroundColor = Color.FromArgb(76, 133, 188);
            dgvSachBC.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            dgvSachBC.Dock = DockStyle.Fill;
            dgvSachBC.MultiSelect = false;
            dgvSachBC.ReadOnly = true;
            dgvSachBC.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvSachBC.AutoGenerateColumns = false;

            // Tạo các cột
            DataGridViewTextBoxColumn colMaSachBC = new DataGridViewTextBoxColumn();
            colMaSachBC.HeaderText = "Mã sách";
            colMaSachBC.DataPropertyName = "MaSach";
            colMaSachBC.Name = "MaSach";
            colMaSachBC.DefaultCellStyle.Format = "00000";

            DataGridViewTextBoxColumn colTenSachBC = new DataGridViewTextBoxColumn();
            colTenSachBC.HeaderText = "Tên sách";
            colTenSachBC.DataPropertyName = "TenSach";
            colTenSachBC.Name = "TenSach";

            DataGridViewTextBoxColumn colNXBBC = new DataGridViewTextBoxColumn();
            colNXBBC.HeaderText = "NXB";
            colNXBBC.DataPropertyName = "NXB";
            colNXBBC.Name = "NXB";

            DataGridViewTextBoxColumn colTheLoaiBC = new DataGridViewTextBoxColumn();
            colTheLoaiBC.HeaderText = "Thể loại";
            colTheLoaiBC.DataPropertyName = "TheLoai";
            colTheLoaiBC.Name = "TheLoai";

            DataGridViewTextBoxColumn colTacGiaBC = new DataGridViewTextBoxColumn();
            colTacGiaBC.HeaderText = "Tác giả";
            colTacGiaBC.DataPropertyName = "TacGia";
            colTacGiaBC.Name = "TacGia";

            DataGridViewTextBoxColumn colSoTrangBC = new DataGridViewTextBoxColumn();
            colSoTrangBC.HeaderText = "Số trang";
            colSoTrangBC.DataPropertyName = "SoTrang";
            colSoTrangBC.Name = "SoTrang";

            DataGridViewTextBoxColumn colNamNXBBC = new DataGridViewTextBoxColumn();
            colNamNXBBC.HeaderText = "Năm XB";
            colNamNXBBC.DataPropertyName = "NamXB";
            colNamNXBBC.Name = "NamXB";

            DataGridViewTextBoxColumn colGiaBC = new DataGridViewTextBoxColumn();
            colGiaBC.HeaderText = "Giá";
            colGiaBC.DataPropertyName = "Gia";
            colGiaBC.Name = "Gia";

            DataGridViewTextBoxColumn colNgayNhapBC = new DataGridViewTextBoxColumn();
            colNgayNhapBC.HeaderText = "Ngày nhập";
            colNgayNhapBC.DataPropertyName = "NgayNhap";
            colNgayNhapBC.Name = "NgayNhap";
            colNgayNhapBC.DefaultCellStyle.Format = "dd/MM/yyyy";

            DataGridViewTextBoxColumn colTrangThaiBC = new DataGridViewTextBoxColumn();
            colTrangThaiBC.HeaderText = "Trạng thái";
            colTrangThaiBC.DataPropertyName = "TrangThai";
            colTrangThaiBC.Name = "TrangThai";

            if (dgvSachBC.Columns.Count == 0)
                dgvSachBC.Columns.AddRange(new DataGridViewColumn[] { colMaSachBC, colTenSachBC, colNXBBC, colTheLoaiBC, colTacGiaBC, colSoTrangBC, colNamNXBBC, colGiaBC, colNgayNhapBC, colTrangThaiBC });
            #endregion
        }

        private void CaiDatdgvDGBC()
        {
            #region Cài đặt dgvDGBC
            dgvDGBC.AllowUserToAddRows = false;
            dgvDGBC.AllowUserToDeleteRows = false;
            dgvDGBC.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvDGBC.BackgroundColor = Color.FromArgb(76, 133, 188);
            dgvDGBC.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            dgvDGBC.Dock = DockStyle.Fill;
            dgvDGBC.MultiSelect = false;
            dgvDGBC.ReadOnly = true;
            dgvDGBC.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvDGBC.AutoGenerateColumns = false;
            dgvDGBC.ContextMenuStrip = cmsQLDocGia;

            // Tạo các cột cần thiết
            DataGridViewTextBoxColumn colMaDocGiaBC = new DataGridViewTextBoxColumn();
            colMaDocGiaBC.HeaderText = "Mã độc giả";
            colMaDocGiaBC.DataPropertyName = "MaDocGia";
            colMaDocGiaBC.Name = "MaDocGia";
            colMaDocGiaBC.DefaultCellStyle.Format = "0000000";

            DataGridViewTextBoxColumn colHTBC = new DataGridViewTextBoxColumn();
            colHTBC.HeaderText = "Họ tên";
            colHTBC.DataPropertyName = "HoTen";
            colHTBC.Name = "HoTen";

            DataGridViewTextBoxColumn colGioiTinhDGBC = new DataGridViewTextBoxColumn();
            colGioiTinhDGBC.HeaderText = "Giới tính";
            colGioiTinhDGBC.DataPropertyName = "GioiTinh";
            colGioiTinhDGBC.Name = "GioiTinh";

            DataGridViewTextBoxColumn colNgaySinhDGBC = new DataGridViewTextBoxColumn();
            colNgaySinhDGBC.HeaderText = "Ngày sinh";
            colNgaySinhDGBC.DataPropertyName = "NgaySinh";
            colNgaySinhDGBC.Name = "NgaySinh";
            colNgaySinhDGBC.DefaultCellStyle.Format = "dd/MM/yyyy";

            DataGridViewTextBoxColumn colNgayLapTheBC = new DataGridViewTextBoxColumn();
            colNgayLapTheBC.HeaderText = "Ngày lập thẻ";
            colNgayLapTheBC.DataPropertyName = "NgayLapThe";
            colNgayLapTheBC.Name = "NgayLapThe";
            colNgayLapTheBC.DefaultCellStyle.Format = "dd/MM/yyyy";

            DataGridViewTextBoxColumn colTrangThaiDGBC = new DataGridViewTextBoxColumn();
            colTrangThaiDGBC.HeaderText = "Trạng thái";
            colTrangThaiDGBC.DataPropertyName = "TrangThai";
            colTrangThaiDGBC.Name = "TrangThai";

            if (dgvDGBC.Columns.Count == 0)
                dgvDGBC.Columns.AddRange(new DataGridViewColumn[] { colMaDocGiaBC, colHTBC, colGioiTinhDGBC, colNgaySinhDGBC, colNgayLapTheBC, colTrangThaiDGBC });
            #endregion
        }

        private void btnInBaoCao_Click(object sender, EventArgs e)
        {
            int thang = Convert.ToInt32(cbbThang.Text);
            int nam = Convert.ToInt32(cbbNam.Text);
            if (radSachDuocMuon.Checked)
            {
                if (dgvSachBC.SelectedRows.Count != 0)
                {
                    if (MessageBox.Show(String.Format("Bạn muốn in danh sách các sách được mượn?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        InBaoCaoSachForm fbcs = new InBaoCaoSachForm();
                        var list = new MuonSachManager().LayDSSachDuocMuon(thang, nam).ObjectList;
                        fbcs.DSS = list;
                        fbcs.ShowDialog();
                    }
                }
            }


            if (radSachNhap.Checked)
            {
                if (dgvSachBC.SelectedRows.Count != 0)
                {
                    if (MessageBox.Show(String.Format("Bạn muốn in danh sách các sách đã nhập?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        InBaoCaoSachNhapForm fbcs = new InBaoCaoSachNhapForm();
                        var list = new SachManager().LayDSSachNhap(thang, nam).ObjectList;
                        fbcs.DSS = list;
                        fbcs.ShowDialog();
                    }
                }
            }
            if (radSachMat.Checked)
            {
                if (dgvSachBC.SelectedRows.Count != 0)
                {
                    if (MessageBox.Show(String.Format("Bạn muốn in danh sách các đã mất?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        InBaoCaoSachMatForm fbcs = new InBaoCaoSachMatForm();
                        var list = new PhatManager().TimKiemSachMat(thang, nam).ObjectList;
                        fbcs.DSS = list;
                        fbcs.ShowDialog();
                    }
                }
            }
            if (radLapTheDocGia.Checked)
            {
                if (dgvDGBC.SelectedRows.Count != 0)
                {
                    if (MessageBox.Show(String.Format("Bạn muốn in danh sách các độc giả lập thẻ?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        InBCDGForm fbcdg = new InBCDGForm();
                        var list = new DocGiaManager().LayDSDocGiaLapThe(thang, nam).ObjectList;
                        fbcdg.DSDG = list;
                        fbcdg.ShowDialog();
                    }
                }
            }
        }

        private void tsmiThemDG_Click(object sender, EventArgs e)
        {
            btnThemDG_Click(btnThemDG, new EventArgs());
        }

        private void tsmiSuaDG_Click(object sender, EventArgs e)
        {
            btnSuaDG_Click(btnSuaDG, new EventArgs());
        }

        private void tsmiXoaDG_Click(object sender, EventArgs e)
        {
            btnXoaDG_Click(btnXoaDG, new EventArgs());
        }

        private void tsmiInDSDG_Click(object sender, EventArgs e)
        {
            btnInDSDG_Click(btnInDSDG, new EventArgs());
        }

        private void tsmiInTheDG_Click(object sender, EventArgs e)
        {
            btnInTheDG_Click(btnInTheDG, new EventArgs());
        }

        private void tsmiKhoaTheDG_Click(object sender, EventArgs e)
        {
            btnKhoaThe_Click(btnKhoaThe, new EventArgs());
        }

        private void radTacGia_CheckedChanged(object sender, EventArgs e)
        {
            if (radSachDuocMuon.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
            }
            if (radSachNhap.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
            }
            if (radSachMat.Checked)
            {
                CaiDatdgvSachBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvSachBC);
            }
            if (radLapTheDocGia.Checked)
            {
                CaiDatdgvDGBC();
                pnlDSHienThi.Controls.Clear();
                pnlDSHienThi.Controls.Add(dgvDGBC);
            }
        }

        private void btnKhoaThe_Click(object sender, EventArgs e)
        {
            if (dgvDocGia.SelectedRows.Count != 0)
            {
                string maDG = Convert.ToString(dgvDocGia.SelectedRows[0].Cells["MaDocGia"].Value);
                if (MessageBox.Show(String.Format("Bạn muốn khóa thẻ độc giả có mã độc giả {0:0000000}?", maDG), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<DocGia> l = (dgvDocGia.DataSource as BindingListView<DocGia>).DataSource as List<DocGia>;
                    DocGia dg = l.Find(s => s.MaDocGia == maDG);
                    ActionResult rs = new DocGiaManager().KhoaThe(dg.MaDocGia);
                    if (rs.Success)
                    {
                        CapNhatDSDocGia(LoaiHanhDong.CapNhat, dg);
                        btnRefresh_Click(btnRefresh, new EventArgs());
                        MessageBox.Show("Khóa thẻ độc giả thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                        MessageBox.Show("Khóa thẻ độc giả thất bại!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void radTenDG_CheckedChanged(object sender, EventArgs e)
        {
            if (radMaDG.Checked == true)
            {
                cbbTKTen.Visible = false;
                cbbTKTT.Visible = false;
                cbbTKMa.Visible = true;
                cbbTKMa.DataSource = new DocGiaManager().LayDSDG().ObjectList;
                cbbTKMa.DisplayMember = "MaDocGia";
            }
            if (radTenDG.Checked == true)
            {
                cbbTKMa.Visible = false;
                cbbTKTT.Visible = false;
                cbbTKTen.Visible = true;
                cbbTKTen.DataSource = new DocGiaManager().LayDSDG().ObjectList;
                cbbTKTen.DisplayMember = "HoTen";
            }
            if (radTrangThaiDG.Checked == true)
            {
                cbbTKTen.Visible = false;
                cbbTKMa.Visible = false;
                cbbTKTT.Visible = true;
            }
        }

        private void radTenS_CheckedChanged(object sender, EventArgs e)
        {
            if (radTenS.Checked)
            {
                cbbTimTenS.Visible = true;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = false;
                cbbTimTenS.Items.Clear();
                var list = new SachManager().LayDSSach().ObjectList;
                foreach (var item in list)
                {
                    if (!cbbTimTenS.Items.Contains(item.TenSach))
                        cbbTimTenS.Items.Add(item.TenSach);
                }
            }
            if (radTacGia.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = true;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = false;
                //cbbTimTG.DataSource = new SachManager().LayDSSach().ObjectList;
                //cbbTimTG.DisplayMember = "TacGia";
                cbbTimTG.Items.Clear();
                var list = new SachManager().LayDSSach().ObjectList;
                foreach (var item in list)
                {
                    if (!cbbTimTG.Items.Contains(item.TacGia))
                        cbbTimTG.Items.Add(item.TacGia);
                }
            }
            if (radNhaXuatBan.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = true;
                cbbTimTL.Visible = false;
                cbbTimNXB.DataSource = new NXBManager().LayDSNXB().ObjectList;
                cbbTimNXB.DisplayMember = "TenNXB";
            }
            if (radTheLoai.Checked)
            {
                cbbTimTenS.Visible = false;
                cbbTimTG.Visible = false;
                cbbTimNXB.Visible = false;
                cbbTimTL.Visible = true;
                cbbTimTL.DataSource = new TheLoaiManager().LayDSTheLoai().ObjectList;
                cbbTimTL.DisplayMember = "TenTheLoai";
            }
        }
        #endregion

        #region Trần Công Huy's code
        #region Thể Loại
        private void CapNhatDSTheLoai(LoaiHanhDong hd, TheLoai t)
        {
            List<TheLoai> list = (dgvTheLoai.DataSource as BindingListView<TheLoai>).DataSource as List<TheLoai>;
            switch (hd)
            {
                case LoaiHanhDong.Them:
                    list.Add(t);
                    dgvTheLoai.DataSource = new BindingListView<TheLoai>(list);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTheLoai.RowCount;
                    break;
                case LoaiHanhDong.Xoa:
                    dgvTheLoai.Rows.Remove(dgvTheLoai.SelectedRows[0]);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTheLoai.RowCount;
                    break;
                case LoaiHanhDong.CapNhat:
                    int index = list.FindIndex(s => s.MaTheLoai == t.MaTheLoai);
                    list[index] = t;
                    dgvTheLoai.DataSource = new BindingListView<TheLoai>(list);
                    break;
                default:
                    break;
            }
        }
        private void btnThemTheLoai_Click(object sender, EventArgs e)
        {
            CapNhatThongTinTheLoaiForm tl = new CapNhatThongTinTheLoaiForm();
            tl.MaTL = "";
            tl.PhuongThucCapNhatTL = new CapNhatTL(CapNhatDSTheLoai);
            tl.ShowDialog();
        }

        private void HienThiDSTheLoai(List<TheLoai> tl)
        {
            if (tl.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu thể loại!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvTheLoai.DataSource = new BindingListView<TheLoai>(tl);
        }
        private void btnLoadTheLoai_Click(object sender, EventArgs e)
        {

            ActionResultAsList<TheLoai> rs = new TheLoaiManager().LayDSTheLoai();
            if (rs.Success)
                HienThiDSTheLoai(rs.ObjectList);
            else
                MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo");
        }

        private void btnSuaTheLoai_Click(object sender, EventArgs e)
        {
            CapNhatThongTinTheLoaiForm f = new CapNhatThongTinTheLoaiForm();
            f.MaTL = Convert.ToString(dgvTheLoai.SelectedRows[0].Cells["MaTheLoai"].Value);
            f.PhuongThucCapNhatTL = new CapNhatTL(CapNhatDSTheLoai);
            f.ShowDialog();
        }
        private void btnXoaTheLoai_Click(object sender, EventArgs e)
        {
            if (dgvTheLoai.SelectedRows.Count > 0)
            {
                DialogResult dlg = MessageBox.Show("Bạn có muốn xóa thể loại không!!!", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    TheLoaiManager tlmn = new TheLoaiManager();
                    string matl = dgvTheLoai.SelectedRows[0].Cells[0].Value.ToString();
                    SachManager smanager = new SachManager();
                    ValidateResult vr = smanager.KiemTraRangBuocKhiXoaTheLoai(matl);
                    if (vr.Valid)
                    {
                        var re = tlmn.XoaTheLoai(matl);
                        if (re.Success)
                        {
                            var list = (dgvTheLoai.DataSource as BindingListView<TheLoai>).DataSource as List<TheLoai>;                           
                            CapNhatDSTheLoai(LoaiHanhDong.Xoa, new TheLoai());
                            MessageBox.Show("Xóa thể loại thành công");
                        }
                        else MessageBox.Show(re.ToString());
                    }
                    else
                        MessageBox.Show(vr.ToString());
                }
            }
            else MessageBox.Show("Bạn chưa chọn thể loại muốn xóa");
        }
        private void btnTimKiemTheLoai_Click(object sender, EventArgs e)
        {
            ActionResultAsList<TheLoai> rs = new ActionResultAsList<TheLoai>();
            string text = txtTimTheLoai.Text.Trim().Replace(".", "").Replace(",", "").Replace("-", "");
            txtTimTheLoai.Text = text;
            if (text == "")
            {
                MessageBox.Show("Chưa nhập thông tin tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtTimTheLoai.Focus();
            }
            else
            {
                if (radTimTheLoaiTheoTen.Checked)
                    rs = new TheLoaiManager().TimKiemTheLoaiTheoTen(txtTimTheLoai.Text);
                else
                    rs = new TheLoaiManager().TimKiemTheLoaiTheoMa(txtTimTheLoai.Text);
                if (rs.Success)
                {
                    HienThiDSTheLoai(rs.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvTheLoai.RowCount;
                }
                else
                    MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion
        #region NXB
        private void CapNhatDSNXB(LoaiHanhDong hd, NXB nxb)
        {
            List<NXB> list = (dgvNXB.DataSource as BindingListView<NXB>).DataSource as List<NXB>;
            switch (hd)
            {
                case LoaiHanhDong.Them:
                    list.Add(nxb);
                    dgvNXB.DataSource = new BindingListView<NXB>(list);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvNXB.RowCount;
                    break;
                case LoaiHanhDong.Xoa:
                    dgvNXB.Rows.Remove(dgvNXB.SelectedRows[0]);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvNXB.RowCount;
                    break;
                case LoaiHanhDong.CapNhat:
                    int index = list.FindIndex(s => s.MaNXB == nxb.MaNXB);
                    list[index] = nxb;
                    dgvNXB.DataSource = new BindingListView<NXB>(list);
                    break;
                default:
                    break;
            }
        }
        private void btnThemNXB_Click(object sender, EventArgs e)
        {
            CapNhatThongTinNXBForm nxb = new CapNhatThongTinNXBForm();
            nxb.MaNXB = "";
            nxb.PhuongThucCapNhatNXB = new CapNhatNXB(CapNhatDSNXB);
            nxb.ShowDialog();
        }

        private void btnSuaNXB_Click(object sender, EventArgs e)
        {
            CapNhatThongTinNXBForm f = new CapNhatThongTinNXBForm();
            f.MaNXB = Convert.ToString(dgvNXB.SelectedRows[0].Cells["MaNXB"].Value);
            f.PhuongThucCapNhatNXB = new CapNhatNXB(CapNhatDSNXB);
            f.ShowDialog();
        }

        private void btnXoaNXB_Click(object sender, EventArgs e)
        {
            if (dgvNXB.SelectedRows.Count > 0)
            {
                DialogResult dlg = MessageBox.Show("Bạn có muốn xóa NXB không!!!", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    NXBManager manager = new NXBManager();
                    SachManager smanager = new SachManager();
                    string manxb = dgvNXB.SelectedRows[0].Cells[0].Value.ToString();
                    ValidateResult vr = new ValidateResult();
                    vr = smanager.KiemTraRangBuocKhiXoaNXB(manxb);
                    if (vr.Valid)
                    {
                        var re = manager.XoaNXB(manxb);
                        if (re.Success)
                        {
                            var list = (dgvNXB.DataSource as BindingListView<NXB>).DataSource as List<NXB>;                           
                            CapNhatDSNXB(LoaiHanhDong.Xoa, new NXB());
                            MessageBox.Show("Xóa NXB thành công");
                        }
                        else MessageBox.Show(re.ToString());
                    }
                    else
                        MessageBox.Show(vr.ToString());
                }
            }
            else MessageBox.Show("Bạn chưa chọn NXB muốn xóa");
        }
        private void HienThiDSNXB(List<NXB> nxb)
        {
            if (nxb.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu NXB!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvNXB.DataSource = new BindingListView<NXB>(nxb);
        }
        private void btnLoadDSNXB_Click(object sender, EventArgs e)
        {
            ActionResultAsList<NXB> rs = new NXBManager().LayDSNXB();
            if (rs.Success)
                HienThiDSNXB(rs.ObjectList);
            else
                MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo");
        }
        private void btnTimKiemNXB_Click(object sender, EventArgs e)
        {
            ActionResultAsList<NXB> rs = new ActionResultAsList<NXB>();
            string text = txtTimKiemNXB.Text.Trim().Replace(".", "").Replace(",", "").Replace("-", "");
            txtTimKiemNXB.Text = text;
            if (text == "")
            {
                MessageBox.Show("Chưa nhập thông tin tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtTimKiemNXB.Focus();
            }
            else
            {
                if (radTimTheoTenNXB.Checked)
                    rs = new NXBManager().TimKiemNXBTheoTen(txtTimKiemNXB.Text);
                else
                    rs = new NXBManager().TimKiemNXBTheoMa(txtTimKiemNXB.Text);
                if (rs.Success)
                {
                    HienThiDSNXB(rs.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvNXB.RowCount;
                }
                else
                    MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion
        #region Sách
        private void HienThiDSSach(List<Sach> sach)
        {
            if (sach.Count == 0)
                MessageBox.Show("Không tìm thấy dữ liệu sách!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                dgvSach.DataSource = new BindingListView<Sach>(sach);
        }
        private void btnLoadDS_Click(object sender, EventArgs e)
        {
            ActionResultAsList<Sach> rs = new SachManager().LayDSSach();
            if (rs.Success)
                HienThiDSSach(rs.ObjectList);
            else
                MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo");
        }
        private void CapNhatDSSach(LoaiHanhDong hd, Sach s)
        {
            List<Sach> list = (dgvSach.DataSource as BindingListView<Sach>).DataSource as List<Sach>;
            switch (hd)
            {
                case LoaiHanhDong.Them:
                    list.Add(s);
                    dgvSach.DataSource = new BindingListView<Sach>(list);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSach.RowCount;
                    break;
                case LoaiHanhDong.Xoa:
                    dgvSach.Rows.Remove(dgvSach.SelectedRows[0]);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSach.RowCount;
                    break;
                case LoaiHanhDong.CapNhat:
                    int index = list.FindIndex(t => t.MaSach == s.MaSach);
                    list[index] = s;
                    dgvSach.DataSource = new BindingListView<Sach>(list);
                    break;
                default:
                    break;
            }
        }
        private void btnThemSach_Click(object sender, EventArgs e)
        {
            CapNhatThongTinSachForm sachform = new CapNhatThongTinSachForm();
            sachform.MaSach = "";
            sachform.PhuongThucCapNhatSach = new CapNhatSach(CapNhatDSSach);
            sachform.Show();
        }

        private void btnSuaSach_Click(object sender, EventArgs e)
        {
            CapNhatThongTinSachForm f = new CapNhatThongTinSachForm();
            f.MaSach = Convert.ToString(dgvSach.SelectedRows[0].Cells["MaSach"].Value);
            f.PhuongThucCapNhatSach = new CapNhatSach(CapNhatDSSach);
            f.ShowDialog();
        }

        private void btnTimKiem_Click(object sender, EventArgs e)
        {
            ActionResultAsList<Sach> rs = new ActionResultAsList<Sach>();
            string text = txtTim.Text.Trim();
            txtTim.Text = text;
            if (text == "")
            {
                MessageBox.Show("Chưa nhập thông tin tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtTimTheLoai.Focus();
            }
            else
            {
                if (radMaSach.Checked)
                    rs = new SachManager().TimKiemSachTheoMa(txtTim.Text);
                else
                    if (radTenSach.Checked)
                        rs = new SachManager().TimKiemSachTheoTen(txtTim.Text);
                    else
                        rs = new SachManager().LaySachTheoTrangThai(txtTim.Text);
                if (rs.Success)
                {
                    HienThiDSSach(rs.ObjectList);
                    lblTongSoDong.Text = "Tổng số dòng: " + dgvSach.RowCount;
                }
                else
                    MessageBox.Show("Xảy ra lỗi!\n\nChi tiết: " + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void btnXoaSach_Click(object sender, EventArgs e)
        {
            if (dgvSach.SelectedRows.Count > 0)
            {
                DialogResult dlg = MessageBox.Show("Bạn có muốn xóa sách không!!!", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    SachManager manager = new SachManager();
                    string masach = dgvSach.SelectedRows[0].Cells[0].Value.ToString();
                    MuonSachManager msmanager = new MuonSachManager();
                    ActionResultAsList<Sach> rs = msmanager.LayDSSachDuocMuon();
                    if (rs.Success)
                        foreach (var item in rs.ObjectList)
                        {
                            if (item.MaSach == masach)
                            {
                                MessageBox.Show("Bị ràng buộc mượn sách, Không thể xóa!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }
                    var re = manager.XoaSach(masach);
                    if (re.Success)
                    {
                        var list = (dgvSach.DataSource as BindingListView<Sach>).DataSource as List<Sach>;
                        CapNhatDSSach(LoaiHanhDong.Xoa, new Sach());
                        MessageBox.Show("Xóa sách thành công");
                    }
                    else MessageBox.Show(re.ToString());
                }
            }
            else MessageBox.Show("Bạn chưa chọn sách muốn xóa");
        }
        private void btnInDSSach_Click(object sender, EventArgs e)
        {
            if (dgvSach.SelectedRows.Count != 0)
            {

                if (MessageBox.Show(String.Format("Bạn muốn in danh sách sách không?"), "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    List<Sach> ls = (dgvSach.DataSource as BindingListView<Sach>).DataSource as List<Sach>;
                    InDSSachForm form = new InDSSachForm();
                    form.DSSach = ls;
                    form.ShowDialog();
                }
            }
        }
        #endregion
        void dgvNXB_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
                this.btnXoaNXB_Click(btnXoaNXB, new EventArgs());
        }

        void dgvTheLoai_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
                this.btnXoaTheLoai_Click(btnXoaTheLoai, new EventArgs());
        }

        void dgvSach_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
                this.btnXoaSach_Click(btnXoaSach, new EventArgs());
        }
        #endregion
    }
}